/*
 * Trabalho ESP
 * Autor: Ricardo Prado
 */
package br.pucsp.projetoesp;

import br.pucsp.projetoesp.acessoRemoto.AcessoRemoto;
import br.pucsp.projetoesp.modeloDeDominio.Dica;
import br.pucsp.projetoesp.logica.TabuleiroFactory;
import br.pucsp.projetoesp.modeloDeDominio.Palavra;
import br.pucsp.projetoesp.modeloDeDominio.Tabuleiro;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import javax.swing.JOptionPane;
import testeGUI.JanelaPrincipal;
import testeGUI.PainelTabuleiro;

/**
 *
 * @author Ricardo
 */
public class Jogo {

    private List<Dica> dicas;
     Date inicioDoJogo;
     Date fimDoJogo;
    private Tabuleiro tabuleiro;
    private AcessoRemoto acessoRemoto;
    private JanelaPrincipal janelaPrincipal;
    private EstadoDeJogo estadoAtual;
    private List<Jogador> todosJogadores;
    private Jogador jogadorSorteado;
    private Dica dicaSendoRespondida;

    public static void main(String args[]) throws Exception {
        new Jogo();
    }

    public Jogo() {
        try {
            acessoRemoto = new AcessoRemoto(this);
            todosJogadores = new LinkedList<Jogador>();

        } catch (Exception ex) {
            System.exit(0);
        }
        iniciarJogo();
    }

    public void registroLiberado() {
        new Thread(acessoRemoto).start();
    }

    public void enviarResposta(String resposta, int indiceDica){
        JOptionPane.showMessageDialog(null, "O aluno respondeu: " + resposta);
        dicaSendoRespondida = dicas.get(indiceDica);
        JOptionPane.showMessageDialog(null, "E a resposta está...");
        if(dicaSendoRespondida.getPalavraResposta().getPalavra().equals(resposta)){
            JOptionPane.showMessageDialog(null, "Correta!");
            dicaSendoRespondida.setEstadoAtual(Dica.EstadoPalavra.RESPONDIDA);
            tabuleiro.desenhar(50, 50, janelaPrincipal.getPainelTabuleiro().getGraphics());
        }
    }

    /**
     * Este método deverá ser chamado
     * quando o jogo for iniciado
     * (o tempo de duração do jogo
     * é iniciado aqio)
     */
    public void iniciarJogo() {


        inicioDoJogo = new Date();
        dicas = carregarDicas();
        
        tabuleiro = new TabuleiroFactory().create(dicas);

        janelaPrincipal = new JanelaPrincipal(tabuleiro, this);
    }

    public EstadoDeJogo getEstadoAtual() {
        return estadoAtual;
    }

    public void registrar(String nomeJogador){
        Jogador novoJogador = new Jogador();
        novoJogador.setNome(nomeJogador);
        if(todosJogadores.contains(novoJogador)){
            return;
        }
        todosJogadores.add(novoJogador);
        
    }

    public void removerJogador(Jogador jogador){
        todosJogadores.remove(jogador);
    }


    public String sortearJogador(){
        int jogadorSorteadoIndex = new Random().nextInt(todosJogadores.size());
        jogadorSorteado = todosJogadores.get(jogadorSorteadoIndex);
        System.out.println("Jogador Sorteado = " + jogadorSorteado.getNome());
        this.estadoAtual = EstadoDeJogo.SORTEADO;
        return jogadorSorteado.getNome();
    }

    public String getJogadorSorteado(){
        return jogadorSorteado.getNome();
    }

    /**
     * Este método deverá ser chamado
     * quando o jogo for terminado
     * (o tempo de duração do jogo
     * é termina aqui)
     */
    void fimDoJogo() {
        fimDoJogo = new Date();
    }

    /**
     * Calcula o tempo de duração da partida
     * O tempo é baseado na diferença de tempo
     * entre as chamadas inicioDoJogo() e
     * fimDoJogo()
     *
     * @return
     */
    int calcularPreenchimentoDoTabuleiro() {
        int tempoPreenchimento = 0;

        long tempoPreenchimentoEmMilis = fimDoJogo.getTime() - inicioDoJogo.getTime();
        tempoPreenchimento = (int) tempoPreenchimentoEmMilis / 1000;

        return tempoPreenchimento;
    }

    /**
     *
     * Este método é chamado quando
     * o LimiteDeTempo de alguma Dica
     * (quando existe um) atinge 7u
     * o timeout
     * @param dica que deu timeout
     */
    public void limiteDeDicaAtingido(Dica d) {
        alertarTempoEsgotado();
    }

    private void alertarTempoEsgotado() {
        //Não implementado!
    }

    public Tabuleiro getTabuleiro() {
        return tabuleiro;
    }

    public void iniciar() {
        this.estadoAtual = EstadoDeJogo.JOGO_INICIADO;
    }

    private List<Dica> carregarDicas() {
        List<Dica> dicas = new ArrayList<Dica>();
        Dica dica0 = new Dica("aplicacao");
        dica0.setPergunta(new Palavra("Código Fonte + Computação"));
        Dica dica1 = new Dica("computador");
        dica1.setPergunta(new Palavra("Código Fonte + Máquina"));
        Dica dica2 = new Dica("tipo");
        dica2.setPergunta(new Palavra("Elemento de organização"));
        Dica dica3 = new Dica("classe");
        dica3.setPergunta(new Palavra("Elemento de codificação"));
        
        dicas.add(dica0);
        dicas.add(dica1);
        dicas.add(dica2);
        dicas.add(dica3);
        return dicas;
    }
}
